package Clases;

import java.util.Random;

import Clases.Posicion.Direccion;
import Clases.Tablero.Estado;

public class Espacio {
	int tamTablero;
	Tablero tablero;//x filas e y columnas
	Posicion alien;
	Posicion misil;
	Posicion defensor;
	boolean hayMisil;
	boolean seDisparoMisil;
	
	public Espacio(int tamTablero){
		this.tamTablero = tamTablero;
	}
	
	public void inicializarEspacio(){
		tablero = null;
		tablero = new Tablero(this.tamTablero);
		hayMisil = false;
		seDisparoMisil = false;
		inicializarAlien();
		inicializarDefensor();
		inicializarMisil();
	}
	
	public void crearEspacio(Posicion alien,Posicion defensor){
		tablero = new Tablero(this.tamTablero);
		hayMisil = false;
		seDisparoMisil = false;
		this.alien = alien;
		this.defensor = defensor;
		inicializarMisil();
		tablero.setEstado(alien.getX(), alien.getY(), Estado.alien);
		tablero.setEstado(defensor.getX(), defensor.getY(), Estado.defensor);
	}
	
	public void setPosicionAlien(int x,int y){
		tablero.setEstado(alien.getX(),alien.getY(),Estado.libre);
		alien.setX(x);
		alien.setY(y);
		tablero.setEstado(x,y,Estado.alien);
	}
	
	public void setPosicionMisil(int x,int y){
		tablero.setEstado(misil.getX(),misil.getY(),Estado.libre);
		misil.setX(x);
		misil.setY(y);
		tablero.setEstado(x,y,Estado.misil);
	}

	public void setPosicionDefensor(int x,int y){
		tablero.setEstado(defensor.getX(),defensor.getY(),Estado.libre);
		defensor.setX(x);
		defensor.setY(y);
		tablero.setEstado(x,y,Estado.defensor);
	}
	
	public boolean[] terminacion(){
		boolean[] termina = new boolean[] {false,false};
		if (alien.getX() == (tamTablero - 1)){
			termina[0] = true; //el juego termina
			termina[1] = false; //el usuario pierde
		}else if(hayMisil && misil.getX() == alien.getX() &&  misil.getY() == alien.getY()){
			termina[0] = true;
			termina[1] = true;
		}
		return termina;
	}
	
	public boolean isTermina(){
		return (alien.getX() == (tamTablero-1)) || (hayMisil && misil.getX() == alien.getX() &&  misil.getY() == alien.getY());
	}
	
	public boolean seAlejanAlienDefensor(){
		int yAlien = alien.getY();
		int yDefensor = defensor.getY();
		Direccion dAlien = alien.getDireccion();
		boolean alejan = false;
		if (yAlien <= yDefensor) alejan = dAlien == Direccion.oeste;
		else alejan = dAlien == Direccion.este;
		return alejan;
	}
	
	public int avanzarTiempo(){
		int nueva_distancia = 0;
		int x = alien.getX();
		int y = alien.getY();
		
		tablero.setEstado(x, y, Estado.libre);
		if (alien.getDireccion() == Direccion.este){
			if (y < tamTablero-1){
				alien.setY(y+1);
			}else{
				alien.setDireccion(Direccion.oeste);
				alien.setX(x+1);
			}
			tablero.setEstado(alien.getX(), alien.getY(), Estado.alien);	
		}else{
			if (y > 0){
				alien.setY(y-1);
			}else{
				alien.setDireccion(Direccion.este);
				alien.setX(x+1);
			}
			tablero.setEstado(alien.getX(), alien.getY(), Estado.alien);
		}
		
		if(hayMisil){
			x = misil.getX();
			y = misil.getY();
			tablero.setEstado(x, y, Estado.libre);
			if (x > 0){
				misil.setX(x-1);
				tablero.setEstado(misil.getX(), misil.getY(), Estado.misil);
				if (misil.getX() == alien.getX() && misil.getY() != alien.getY()){
					nueva_distancia = Math.abs(misil.getY() - alien.getY());
				}else if (misil.getX() ==  0){
					tablero.setEstado(misil.getX(), misil.getY(), Estado.libre);
					hayMisil = false;
				}		
			}else{
				if (x == 0) hayMisil = false;
			}
		}
		return nueva_distancia;
	}
	
	public int getTamTablero() {
		return tamTablero;
	}
	
	public void setTablero(int x,int y,Estado estado){
		tablero.setEstado(x, y, estado);
	}
	
	public Tablero getTablero(){
		return tablero;
	}

	public void setTamTablero(int tamTablero) {
		this.tamTablero = tamTablero;
	}

	public Posicion getAlien() {
		return alien;
	}

	public void setAlien(Posicion alien) {
		this.alien = alien;
	}

	public Posicion getMisil() {
		return misil;
	}

	public void setMisil(Posicion misil) {
		this.misil = misil;
	}

	public Posicion getDefensor() {
		return defensor;
	}

	public void setDefensor(Posicion defensor) {
		this.defensor = defensor;
	}

	public boolean isHayMisil() {
		return hayMisil;
	}

	public void setHayMisil(boolean hayMisil) {
		this.hayMisil = hayMisil;
	}

	public boolean isSeDisparoMisil() {
		return seDisparoMisil;
	}
	
	public void setSeDisparoMisil(boolean seDisparoMisil) {
		this.seDisparoMisil = seDisparoMisil;
	}
	
	private void inicializarDefensor() {
		Random r = new Random();
		int y = r.nextInt(tamTablero);
		defensor = new Posicion(tamTablero-1,y);
		tablero.setEstado(defensor.getX(), defensor.getY(), Estado.defensor);
	}

	private void inicializarAlien() {
		Random r = new Random();
		int x = r.nextInt(6);
		int y = r.nextInt(tamTablero);
		alien = new Posicion(x,y);
		alien.setDireccionAleatoria();
		tablero.setEstado(alien.getX(), alien.getY(), Estado.alien);
	}
	
	private void inicializarMisil(){
		misil = new Posicion(tamTablero-1, tamTablero-1);
	}
	
	public static void main(String[] args){
		Espacio espacio = new Espacio(20);
		espacio.inicializarEspacio();
		espacio.avanzarTiempo();
	}
}
